Managing and operating distributed applications across a cluster of machines is notoriously hard to do correctly and without unintended disruptions. Often different operations aspects collide in practice, such as upgrading the application while one machine is down and taking too many instances down at the same time. Typical solutions fall into two camps: remote execution (imperative) systems and instance count (declarative) systems. Remote execution systems are usually built around management of templates of an underlying scripting language. Instance count systems are usually built around containers or similar packaging and target stateless applications.